package org.jeecg.modules.drive.service;

import com.alibaba.fastjson.JSONObject;

/**
 * 接口驱动模型-天翼Aiot
 *
 * https://www.ctwing.cn/channel-help-api.htm?api=99
 */
public interface IDriveCtwingService {


    /**-------------------------------------------产品--------------------------------------------------------*/

    /**
     * 根据产品ID查询产品数据
     * 访问路径：/product
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param productId
     */
    public JSONObject sdkNbQueryProduct(String appKey, String appSecret, String productId) throws Exception;

    /**
     * 批量查询产品信息
     * 访问路径：/products
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param searchValue
     * @param pageNow
     * @param pageSize
     */
    public JSONObject sdkNbQueryProductList(String appKey, String appSecret, String searchValue, int pageNow, int pageSize) throws Exception;

    /**-----------------------------------------------设备--------------------------------------------------------*/

    /**
     * 访问路径：/device
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param productId
     */
    public JSONObject sdkNbQueryDevice(String appKey, String appSecret, String masterKey, String productId, String deviceId) throws Exception;

    /**
     * 批量获取设备信息
     * 访问路径：/devices
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param searchValue
     * @param pageNow
     * @param pageSize
     */
    public JSONObject sdkNbQueryDeviceList(String appKey, String appSecret, String masterKey,
                                           String productId, String searchValue, int pageNow, int pageSize) throws Exception;


    /**-----------------------------------------------事件上报-----------------------------------------------------*/

    /**
     * 查询事件上报列表
     * 访问路径：/device/events
     * 请求方法：POST
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param paramJson  == request.setBody(paramJson.toJSONString().getBytes())
     * {
     *    "productId":"10000088",//必填
     *    "deviceId":"10000088001",//必填
     *    "eventType":1,//非必填
     *    "startTime":"1538981624878",//必填
     *    "endTime":"1539575396505",//必填
     *    "pageSize":10,//必填
     *    "pageTimestamp":"1539575396505"//非必填
     * }
     */
    public JSONObject sdkNbQueryDeviceEventList(String appKey, String appSecret, String masterKey, JSONObject paramJson) throws Exception;


    /**-----------------------------------------------指令下发-----------------------------------------------------*/

    /**
     * 统一合并指令下发
     * 访问路径：/command
     * 请求方法：POST
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param paramJson == request.setBody(paramJson.toJSONString().getBytes())
     * {
     *   "content": {},
     *   "deviceId": "string",
     *   "operator": "string",
     *   "productId": 0,
     *   "ttl": 7200,
     *   "deviceGroupId": 100,
     *   "level": 1
     * }
     * deviceId: 设备ID，（当指令级别为设备级时必填，为设备组级时则不填）
     * operator: 操作者，必填
     * productId: 产品ID，必填
     * ttl: 设备指令缓存时长，选填。单位：秒，取值范围：0-864000。
     *      不携带则默认值：7200。如不需缓存请填0。
     * level:指令级别，1或2为设备级别,3为设备组级别，选填。不填默认设备级。
     * deviceGroupId：设备组ID，选填，当指令级别为设备级，
     *                deviceId不为空，deviceGroupId为空；
     *                当指令级别为设备组级，deviceId为空，deviceGroupId不为空。
     * content: 指令内容，必填，格式为Json。
     *
     */
    public JSONObject sdkNbCreateCommand(String appKey, String appSecret, String masterKey,
                                         JSONObject paramJson, JSONObject contentJson) throws Exception;

    /**
     * 查询单个指令详情
     * 访问路径：/command
     * 请求方法：POST
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param productId
     * @param deviceId
     * @param commandId
     *
     */
    public JSONObject sdkNbQueryCommand(String appKey, String appSecret, String masterKey,
                                        String productId, String deviceId,String commandId) throws Exception;


    /**
     * 取消指令
     * 访问路径：/cancelCommand
     * 请求方法：PUT
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param paramJson == request.setBody(paramJson.toJSONString().getBytes())
     * {
     *   productId  设备ID
     *   deviceId   产品Id
     * }
     */
    public JSONObject sdkNbCancelCommand(String appKey, String appSecret, String masterKey, JSONObject paramJson) throws Exception;

    /**-----------------------------------------------数据查询-----------------------------------------------------*/

    /**
     * 批量获取设备最新状态数据接口
     * 访问路径：/deviceStatusList
     * 请求方法：POST
     *
     * @param appKey
     * @param appSecret
     * @param paramJson == request.setBody(paramJson.toJSONString().getBytes())
     * {
     *  "productId":"3238",
     *  "deviceId":"1da54369fec54dfebce4accc69e9f338"
     *  }
     */
    public JSONObject sdkNbQueryDeviceStatusList(String appKey, String appSecret, JSONObject paramJson) throws Exception;

    /**
     * 终端单个最新状态查询接口
     * 访问路径：//deviceStatus
     * 请求方法：POST
     *
     * @param appKey
     * @param appSecret
     * @param paramJson == request.setBody(paramJson.toJSONString().getBytes())
     * {
     *    "productId":"3238",
     *    "deviceId":"1da54369fec54dfebce4accc69e9f338",
     *    "datasetId":"temperature"
     * }
     *  其中datasetId为待查询的设备上报消息中某个属性标识,透传数据datasetId为"APPdata"
     *
     */
    public JSONObject sdkNbQueryDeviceStatus(String appKey, String appSecret, JSONObject paramJson) throws Exception;

    /**-----------------------------------------------物模型-----------------------------------------------------*/

    /**
     * 查询属性列表信息
     * 访问路径：/dm/app/model/properties
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param productId
     * @param searchValue 可填值：属性名称，属性标识符
     *
     */
    public JSONObject sdkNbQueryPropertyList(String appKey, String appSecret, String masterKey,
                                             String productId, String searchValue, int pageNow, int pageSize) throws Exception;


    /**
     * 查询属性列表信息
     * 访问路径：/dm/app/model/services
     * 请求方法：GET
     *
     * @param appKey
     * @param appSecret
     * @param masterKey
     * @param productId
     * @param searchValue 可填： 服务Id, 服务名称,服务标识符
     * @param serviceType 服务类型 1. 数据上报 2. 事件上报 3.数据获取 4.参数查询 5.参数配置 6.指令下发 7.指令下发响应
     *
     *
     */
    public JSONObject sdkNbQueryServiceList(String appKey, String appSecret, String masterKey, String productId,
                                            String searchValue, int serviceType, int pageNow, int pageSize) throws Exception;
}